﻿using System.Collections.Generic;
using HK.Core.Common.Data;
using HK.Core.Common.Protocol;
using HK.Core.Common.Protocol.Data;

namespace HK.Core.IO.Protocol.Data
{
    /// <summary>
    /// Jab文件后缀
    /// </summary>
    public enum JabFileSuffix
    {
        None = 0,
        /// <summary>
        /// *.asset文件
        /// </summary>
        Asset = 1,
        /// <summary>
        /// *.asset.manifest文件
        /// </summary>
        AssetManifest = 2,
        /// <summary>
        /// *.prefab.asset文件
        /// </summary>
        PrefabAsset = 3,
        /// <summary>
        /// *.prefab.asset.manifest文件
        /// </summary>
        PrefabAssetManifest = 4,
        /// <summary>
        /// *.manifest
        /// </summary>
        Manifest = 5,
        /// <summary>
        /// 未知类型
        /// </summary>
        UnKnown = 6
    }
    
    /// <summary>
    /// 接口 : Jab文件中包含的子文件
    /// </summary>
    public interface IJabChildFile : IJsonData
    {
        /// <summary>
        /// Jab名
        /// <para>* 相对目录。如：Assets/xxxx/yyyy.jab</para>
        /// </summary>
        string JabName { get; }
        
        /// <summary>
        /// 路径
        /// </summary>
        string Path { get; set; }
        
        /// <summary>
        /// 大小(非压缩)
        /// <para>* 单位 : Byte</para>
        /// </summary>
        int Size { get; set; }
        
        /// <summary>
        /// 压缩大小
        /// <para>* 单位 : Byte</para>
        /// </summary>
        int UncSize { get; set; }
        
        /// <summary>
        /// 
        /// </summary>
        double Time { get; set; }
        
        /// <summary>
        /// 验证码 - Crc
        /// </summary>
        uint Crc { get; set; }
        
        /// <summary>
        /// Crc有效标志位
        /// </summary>
        bool CrcValid { get; }
        
        /// <summary>
        /// 有效数据在数据段中的偏移
        /// </summary>
        uint DataLocalOffset { get; set; }
    }

    /// <summary>
    /// 接口 : Jab文件头部
    /// </summary>
    public interface IJabHeader<TFile> : IJsonData
        where TFile : JsonData, IJabChildFile
    {
        /// <summary>
        /// 版本
        /// <para>大于2 : 包含压缩格式设定</para>
        /// <para>大于3 : 包含有所在文件加前缀信息</para>
        /// </summary>
        byte Version { get; }
        
        /// <summary>
        /// 压缩标志位
        /// <para>* 1 : zlib压缩</para>
        /// </summary>
        bool Compress { get; }
        
        /// <summary>
        /// 数据段位置
        /// </summary>
        uint DataSectionGOffset { get; }
        
        /// <summary>
        /// 子文件个数
        /// </summary>
        uint ChildCount { get; }
        
        /// <summary>
        /// 所在文件夹前缀
        /// </summary>
        string Prefix { get; set; }
        
        /// <summary>
        /// 子文件加列表
        /// </summary>
        List<TFile> Children { get; }

        /// <summary>
        /// 追加子文件信息
        /// </summary>
        /// <param name="iChild">子节点</param>
        /// <returns>true:OK; false:NG;</returns>
        bool AddChild(TFile iChild);
    }
}
